package br.com.infnet.projeto.bloco.dao.impl;

import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import br.com.infnet.projeto.bloco.dao.ContaPoupancaDAO;
import br.com.infnet.projeto.bloco.exception.ObjetoNaoEncontradoException;
import br.com.infnet.projeto.bloco.model.ContaPoupanca;

public class ContaPoupancaDAOImpl implements ContaPoupancaDAO {

	private EntityManager entityManager;

	public ContaPoupancaDAOImpl(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	public long incluir(ContaPoupanca contaPoupanca) {
		entityManager.persist(contaPoupanca);
		return contaPoupanca.getId();
	}

	public boolean excluir(ContaPoupanca contaPoupanca) {
		try {
			ContaPoupanca conta = entityManager.getReference(
					ContaPoupanca.class, new Long(contaPoupanca.getId()));
			entityManager.remove(conta);
			return true;
		} catch (EntityNotFoundException e) {
			return false;
		}
	}

	public boolean alterar(ContaPoupanca contaPoupanca) {
		try {
			entityManager.getReference(ContaPoupanca.class, new Long(
					contaPoupanca.getId()));
			entityManager.merge(contaPoupanca);
			return true;
		} catch (EntityNotFoundException e) {
			return false;
		}
	}

	public ContaPoupanca buscar(long id) throws ObjetoNaoEncontradoException {

		ContaPoupanca contaPoupanca = (ContaPoupanca) entityManager.find(
				ContaPoupanca.class, new Long(id));

		if (contaPoupanca == null) {
			throw new ObjetoNaoEncontradoException();
		}

		return contaPoupanca;
	}
	
	public ContaPoupanca buscarPorNumero(Long numeroConta) throws ObjetoNaoEncontradoException {
		try
		{
			Query query = entityManager.createQuery("select c from ContaPoupanca c where c.numero = :numeroConta");
			query.setParameter("numeroConta", numeroConta);
			ContaPoupanca contaPoupanca = (ContaPoupanca) query.getSingleResult();
			return contaPoupanca;
		}
		catch(NoResultException e)
		{
			throw new ObjetoNaoEncontradoException();
		}
	}

}
